// simple-dns.js

const dgram = require('dgram');
const dnsPacket = require('dns-packet');

// 创建 UDP 服务器
const server = dgram.createSocket('udp4');

// 自定义域名映射
const RECORDS = {
  'ohos.axios.com': '113.45.193.209',
  'hello.world': '127.0.0.1',
  'api.mock': '192.168.1.50'
};

// DNS 标志：QR = 1 表示是响应包
const FLAGS = {
  QR: 1 << 15,  // Query Response
  AA: 1 << 10,  // Authoritative Answer
  RA: 1 << 7,   // Recursion Available
};

// 监听客户端请求
server.on('message', (msg, rinfo) => {
  try {
    // 1. 解析 DNS 查询
    const req = dnsPacket.decode(msg);
    const question = req.questions[0];
    const name = question.name;
    const type = question.type;

    console.log(`📩 查询: ${name} (来自 ${rinfo.address}:${rinfo.port})`);

    // 2. 构造响应
    const res = {
      type: 'response',
      id: req.id,
      flags: FLAGS.QR | FLAGS.AA | FLAGS.RA, // 响应 + 权威 + 递归可用
      questions: req.questions,
      answers: []
    };

    // 3. 只处理 A 记录
    if (type === 'A' && RECORDS[name]) {
      // 域名存在，返回 IP
      res.answers.push({
        type: 'A',
        name: name,
        data: RECORDS[name],
        ttl: 600
      });
    } else {
      // 域名不存在
      res.rcode = 'NXDOMAIN'; // 域名不存在
    }

    // 4. 编码并发送响应
    const buffer = dnsPacket.encode(res);
    server.send(buffer, rinfo.port, rinfo.address, (err) => {
      if (err) console.error('📤 发送失败:', err);
    });

  } catch (err) {
    console.error('❌ 处理失败:', err);
  }
});

// 启动服务器，监听 5353 端口（避免需要 root 权限）
server.bind(53, () => {
  console.log('🚀 简易 DNS 服务器启动！');
  console.log('🎯 监听端口: 5353');
  console.log('📌 支持的域名:');
  Object.keys(RECORDS).forEach(domain => {
    console.log(`   ${domain} → ${RECORDS[domain]}`);
  });
});